#include <iostream>
#include <mysql.h>
#include <list>
#include <map>
#include <string>

// 将查询结果转换为 list<map> 结构
std::list<std::map<std::string, std::string>> resultToList(MYSQL_RES* res) {
	std::list<std::map<std::string, std::string>> resultList;
	
	if (!res) {
		std::cerr << "错误：结果集为空" << std::endl;
		return resultList;
	}
	
	// 获取列数和列名
	int num_fields = mysql_num_fields(res);
	MYSQL_FIELD* fields = mysql_fetch_fields(res);
	
	// 存储列名
	std::string* columnNames = new std::string[num_fields];
	for (int i = 0; i < num_fields; ++i) {
		columnNames[i] = fields[i].name;
	}
	
	// 逐行处理结果
	MYSQL_ROW row;
	while ((row = mysql_fetch_row(res))) {
		std::map<std::string, std::string> rowMap;
		unsigned long* lengths = mysql_fetch_lengths(res);
		
		for (int i = 0; i < num_fields; ++i) {
			// 处理 NULL 值
			std::string value = row[i] ? std::string(row[i], lengths[i]) : "NULL";
			rowMap[columnNames[i]] = value;
		}
		resultList.push_back(rowMap);
	}
	
	delete[] columnNames;
	return resultList;
}

// 使用示例
int main() {
	MYSQL* conn = mysql_init(nullptr);
	if (!conn) {
		std::cerr << "初始化失败: " << mysql_error(conn);
		return 1;
	}
	
	// 连接数据库（替换为你的实际参数）
	if (!mysql_real_connect(conn, "120.46.52.43", "root","Wangyidan1",  "dawu", 3306, nullptr, 0)) {
		std::cerr << "连接失败: " << mysql_error(conn);
		mysql_close(conn);
		return 1;
	}
	
	// 执行查询
	if (mysql_query(conn, "SELECT id, name, email FROM sys_user")) {
		std::cerr << "查询失败: " << mysql_error(conn);
		mysql_close(conn);
		return 1;
	}
	
	// 获取结果集
	MYSQL_RES* res = mysql_store_result(conn);
	if (!res) {
		std::cerr << "结果集错误: " << mysql_error(conn);
		mysql_close(conn);
		return 1;
	}
	
	// 转换为 list<map>
	auto result = resultToList(res);
	
	// 打印结果
	std::cout << "查询结果 (" << result.size() << " 行):\n";
	int rowNum = 1;
	for (const auto& row : result) {
		std::cout << "\n行 #" << rowNum++ << ":\n";
		for (const auto& col : row) {
			std::cout << "  " << col.first << ": " << col.second << "\n";
		}
	}
	
	// 清理资源
	mysql_free_result(res);
	mysql_close(conn);
	return 0;
}


